Node.js Error Handling

வலுவான Node.js பயன்பாடுகளை உருவாக்க பிழை கையாளுதலின் முக்கியத்துவத்தைப் புரிந்துகொள்ளுங்கள்

ஏன் பிழைகளைக் கையாள வேண்டும்?

பிழைகள் எந்த நிரலிலும் தவிர்க்க முடியாதவை, ஆனால் நீங்கள் அவற்றை எவ்வாறு கையாள்கிறீர்கள் என்பது அனைத்து வித்தியாசத்தையும் உருவாக்குகிறது. Node.js இல், சரியான பிழை கையாளுதல் முக்கியமானது, ஏனெனில்:

திடீர் செயலிழப்பைத் தடுக்கிறது

பயன்பாடுகள் எதிர்பாராத விதமாக செயலிழப்பதைத் தடுக்கிறது

பயனர்களுக்கு அர்த்தமுள்ள கருத்து

பயனர்களுக்கு அர்த்தமுள்ள கருத்தை வழங்குகிறது

பிழைத்திருத்தத்தை எளிதாக்குகிறது

சரியான பிழை சூழலுடன் பிழைத்திருத்தத்தை எளிதாக்குகிறது

உற்பத்தியில் நிலைத்தன்மை

உற்பத்தியில் பயன்பாட்டு நிலைத்தன்மையை பராமரிக்க உதவுகிறது

Node.js இல் பொதுவான பிழை வகைகள்

வெவ்வேறு பிழை வகைகளைப் புரிந்துகொள்வது அவற்றை சரியாகக் கையாள உதவுகிறது:

1. நிலையான JavaScript பிழைகள்

// SyntaxError
JSON.parse('{invalid json}');

// TypeError
null.someProperty;

// ReferenceError
unknownVariable;

2. கணினி பிழைகள்

// ENOENT: No such file or directory
const fs = require('fs');
fs.readFile('nonexistent.txt', (err) => {
  console.error(err.code); // 'ENOENT'
});

// ECONNREFUSED: Connection refused
const http = require('http');
const req = http.get('http://nonexistent-site.com', (res) => {});
req.on('error', (err) => {
  console.error(err.code); // 'ECONNREFUSED' or 'ENOTFOUND'
});

அடிப்படை பிழை கையாளுதல்

Node.js பிழை கையாளுதலுக்கு பல முறைகளைப் பின்பற்றுகிறது:

பிழை-முதல் கால்பேக்குகள்

Node.js முக்கிய தொகுதிகளில் மிகவும் பொதுவான முறை, இதில் கால்பேக்கிற்கான முதல் வாதம் ஒரு பிழை பொருளாகும் (ஏதேனும் ஏற்பட்டால்).

எடுத்துக்காட்டு: பிழை-முதல் கால்பேக்

const fs = require('fs');

function readConfigFile(filename, callback) {
  fs.readFile(filename, 'utf8', (err, data) => {
    if (err) {
      // Handle specific error types
      if (err.code === 'ENOENT') {
        return callback(new Error(`Config file ${filename} not found`));
      } else if (err.code === 'EACCES') {
        return callback(new Error(`No permission to read ${filename}`));
      }
      // For all other errors
      return callback(err);
    }

    // Process data if no error
    try {
      const config = JSON.parse(data);
      callback(null, config);
    } catch (parseError) {
      callback(new Error(`Invalid JSON in ${filename}`));
    }
  });
}

// Usage
readConfigFile('config.json', (err, config) => {
  if (err) {
    console.error('Failed to read config:', err.message);
    // Handle the error (e.g., use default config)
    return;
  }
  console.log('Config loaded successfully:', config);
});

நவீன பிழை கையாளுதல்

Async/Await உடன் try...catch பயன்படுத்துதல்

Async/await உடன், நீங்கள் ஒத்திசைவு மற்றும் அசிங்க்ரோனஸ் குறியீடு இரண்டிற்கும் try/catch தொகுதிகளைப் பயன்படுத்தலாம்:

எடுத்துக்காட்டு: Async/Await உடன் try/catch

const fs = require('fs').promises;

async function loadUserData(userId) {
  try {
    const data = await fs.readFile(`users/${userId}.json`, 'utf8');
    const user = JSON.parse(data);

    if (!user.email) {
      throw new Error('Invalid user data: missing email');
    }

    return user;
  } catch (error) {
    // Handle different error types
    if (error.code === 'ENOENT') {
      throw new Error(`User ${userId} not found`);
    } else if (error instanceof SyntaxError) {
      throw new Error('Invalid user data format');
    }
    // Re-throw other errors
    throw error;
  } finally {
    // Cleanup code that runs whether successful or not
    console.log(`Finished processing user ${userId}`);
  }
}

// Usage
(async () => {
  try {
    const user = await loadUserData(123);
    console.log('User loaded:', user);
  } catch (error) {
    console.error('Failed to load user:', error.message);
    // Handle error (e.g., show to user, retry, etc.)
  }
})();

உலகளாவிய பிழை கையாளுதல்

கைப்பற்றப்படாத விதிவிலக்குகள்

எதிர்பாராத பிழைகளுக்கு, வெளியேறுவதற்கு முன் சுத்தம் செய்ய uncaughtException க்கு கேட்கலாம்:

எடுத்துக்காட்டு: உலகளாவிய பிழை கையாளுபவர்கள்

// Handle uncaught exceptions (synchronous errors)
process.on('uncaughtException', (error) => {
  console.error('UNCAUGHT EXCEPTION! Shutting down...');
  console.error(error.name, error.message);

  // Perform cleanup (close database connections, etc.)
  server.close(() => {
    console.log('Process terminated due to uncaught exception');
    process.exit(1); // Exit with failure
  });
});

// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
  console.error('UNHANDLED REJECTION! Shutting down...');
  console.error('Unhandled Rejection at:', promise, 'Reason:', reason);

  // Close server and exit
  server.close(() => {
    process.exit(1);
  });
});

// Example of an unhandled promise rejection
Promise.reject(new Error('Something went wrong'));

// Example of an uncaught exception
setTimeout(() => {
  throw new Error('Uncaught exception after timeout');
}, 1000);

பிழை கையாளுதல் சிறந்த நடைமுறைகள்

செய்ய வேண்டியவை

பொருத்தமான நிலையில் பிழைகளைக் கையாளவும்
போதுமான சூழலுடன் பிழைகளைப் பதிவு செய்யவும்
வெவ்வேறு சூழ்நிலைகளுக்கு தனிப்பயன் பிழை வகைகளைப் பயன்படுத்தவும்
finally தொகுதிகளில் வளங்களை சுத்தம் செய்யவும்
பிழைகளை விரைவில் கைப்பற்ற உள்ளீட்டைச் சரிபார்க்கவும்

செய்ய வேண்டாம்

பிழைகளைப் புறக்கணிக்கவும் (காலி catch தொகுதிகள்)
உணர்திறன் பிழை விவரங்களை வாடிக்கையாளர்களுக்கு வெளிப்படுத்தவும்
பாய்வு கட்டுப்பாட்டிற்கு try/catch ஐப் பயன்படுத்தவும்
அவற்றைப் பதிவு செய்யாமல் பிழைகளை விழுங்கவும்
மீட்க முடியாத பிழைகளுக்குப் பிறகு செயல்பாட்டைத் தொடரவும்

தனிப்பயன் பிழை வகைகள்

class ValidationError extends Error {
  constructor(message, field) {
    super(message);
    this.name = 'ValidationError';
    this.field = field;
    this.statusCode = 400;
  }
}

class NotFoundError extends Error {
  constructor(resource) {
    super(`${resource} not found`);
    this.name = 'NotFoundError';
    this.statusCode = 404;
  }
}

// Usage
function getUser(id) {
  if (!id) {
    throw new ValidationError('User ID is required', 'id');
  }
  // ...
}

சுருக்கம்

திறம்பட்ட பிழை கையாளுதல் வலுவான Node.js பயன்பாடுகளை உருவாக்குவதின் முக்கிய அம்சமாகும்.

வெவ்வேறு பிழை வகைகளைப் புரிந்துகொள்வதன் மூலம், பொருத்தமான முறைகளைப் பயன்படுத்துதல் மற்றும் சிறந்த நடைமுறைகளைப் பின்பற்றுதல் ஆகியவற்றின் மூலம், நீங்கள் மிகவும் நிலையான, பராமரிக்கக்கூடிய மற்றும் பயனர்-நட்பான பயன்பாடுகளை உருவாக்கலாம்.

செயலிழப்பைத் தடுக்கிறது

திடீர் செயலிழப்புகளைத் தடுக்கிறது

அர்த்தமுள்ள கருத்து

பயனர்களுக்கு அர்த்தமுள்ள கருத்தை வழங்குகிறது

தரவு ஒருமைப்பாடு

தரவு ஒருமைப்பாட்டைப் பராமரிக்கிறது

பயனர் அனுபவம்

பிரச்சினைகள் ஏற்பட்டாலும் நல்ல பயனர் அனுபவத்தை உறுதி செய்கிறது

💎 முக்கிய புள்ளிகள்:

  • நல்ல பிழை கையாளுதல் செயலிழப்புகளைத் தடுப்பதை மட்டும் குறிக்காது
  • அர்த்தமுள்ள கருத்தை வழங்குவது, தரவு ஒருமைப்பாட்டைப் பராமரிப்பது மற்றும் பிரச்சினைகள் ஏற்பட்டாலும் நல்ல பயனர் அனுபவத்தை உறுதி செய்வது ஆகியவை அடங்கும்
  • வெவ்வேறு பிழை வகைகளைப் புரிந்துகொள்ளுங்கள் மற்றும் பொருத்தமான முறைகளைப் பயன்படுத்துங்கள்
  • எப்போதும் finally தொகுதிகளில் வளங்களை சுத்தம் செய்யுங்கள்
  • தனிப்பயன் பிழை வகைகள் சிறந்த பிழை மேலாண்மைக்கு உதவுகின்றன

பயிற்சி

சரியான சொல்லை தேர்ந்தெடுக்கவும்.

Node.js இல், பிழைகளை ______ தொகுதிகளுடன் கையாளலாம்.

if...else
✗ தவறு! if...else தொகுதிகள் நிபந்தனை தர்க்கத்திற்குப் பயன்படுத்தப்படுகின்றன, பிழை கையாளுதலுக்கு அல்ல
try...catch
✓ சரி! try...catch தொகுதிகள் Node.js இல் ஒத்திசைவு மற்றும் அசிங்க்ரோனஸ் பிழைகளைக் கையாள பயன்படுத்தப்படுகின்றன
switch...case
✗ தவறு! switch...case தொகுதிகள் பல நிபந்தனை கிளைகளுக்குப் பயன்படுத்தப்படுகின்றன, பிழை கையாளுதலுக்கு அல்ல
for...in
✗ தவறு! for...in தொகுதிகள் பொருள்களின் பண்புகள் வழியாக மறுசெயல்பாட்டிற்குப் பயன்படுத்தப்படுகின்றன, பிழை கையாளுதலுக்கு அல்ல